﻿/*
 
 Author : alejandro (T-IT Brasil)
 Data   : 23/09/2011

 */
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using System.Linq;
using System.Collections.Generic;
using System.Net;
using System.IO;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;


using iTextSharp.text;
using iTextSharp.text.pdf;

namespace Presentation.HotSite.WebPart.VWPPosEventoResiduos
{
    public partial class VWPPosEventoResiduosUserControl : UserControl
    {
        private SPWeb myWeb = SPContext.Current.Web;
        private String nomeListaCertificado = Data.HotSite.Properties.SharepointStrings.ListaCertificadoEmitidos; // "Certificados Emitidos";
        private String nomeListaInscritos = Data.HotSite.Properties.SharepointStrings.ListaInscritos; //"Inscritos";
        private PrivateFontCollection privateFontCollection;

        protected void Page_Load(object sender, EventArgs e)
        {

            getFontCollection();

            if (Page.IsPostBack)
            {
                try
                {
                    if (String.IsNullOrEmpty(txtCpf.Text))
                    {
                        throw new UserErrorException("Campo CPF não preenchido!");
                    }
                    else
                    {
                        getCertificadoInteressado();
                        savePesquisa();
                    }
                }
                catch (UserErrorException ex)
                {
                    lblMsgServidor.Text = ex.Message;
                }
            }
        }

        private void getCertificadoInteressado()
        {
            string cpf = string.Empty;
            SPList myLista = myWeb.Lists[nomeListaInscritos];

            cpf = txtCpf.Text;

            var myItemCertificado = myLista.Items.Cast<SPListItem>().Where(i => cpf.Equals(i["CPF"])).ToList();
            if (myItemCertificado.Count > 0)
            {
                if (myItemCertificado[0]["certificado"].Equals(true))
                {
                    emitirCertificado(myItemCertificado[0]["nome"].ToString(), myItemCertificado[0]["CPF"].ToString(), "22 de novembro de 2012");
                }
                else
                {
                    throw new UserErrorException("Certificado não disponível, favor contate os organizadores do evento pelo e-mail: medicamentos@abdi.com.br");
                }
            }
            else
            {
                throw new UserErrorException("Não existe certificado para o CPF preenchido!");
            }
        }

        private void savePesquisa()
        {
            if ((String.IsNullOrEmpty(rblAvaliacaoGeral.Text)
                && String.IsNullOrEmpty(rblConteudo.Text)
                && String.IsNullOrEmpty(rblOrganizacao.Text)
                && String.IsNullOrEmpty(rblInfraestrutura.Text)
                && String.IsNullOrEmpty(txtComentario.Text))
                || existeCpf(txtCpf.Text)) {
                return;
            }

            SPList myList;
            SPListItem myItem;

            myList = myWeb.Lists["Pesquisa"];
            myItem = myList.Items.Add();

            myItem["Avalia_x00e7__x00e3_o_x0020_Gera"] = rblAvaliacaoGeral.Text;
            myItem["Conte_x00fa_do"] = rblConteudo.Text;
            myItem["Organiza_x00e7__x00e3_o"] = rblOrganizacao.Text;
            myItem["Infraestrutura"] = rblInfraestrutura.Text;
            myItem["Coment_x00e1_rio"] = txtComentario.Text.Trim();
            myItem["cpf"] = txtCpf.Text;

            myItem.Update();
        }

        private bool existeCpf(string valorCPF)
        {
            Boolean existe = false;
            SPListItemCollection listItems = myWeb.Lists["Pesquisa"].Items;

            foreach (SPListItem oItem in listItems)
            {
                String cpfLista = oItem["cpf"] == null ? "" : oItem["cpf"].ToString();
                if (cpfLista.Equals(valorCPF))
                {
                    existe = true;
                    break;
                }
            }

            return existe;
        }

        /// <summary>
        /// Seta o tipo de fonte que será utilizado para disenhar o nome, data e local no certificado.
        /// </summary>
        private void getFontCollection()
        {
            if (Application["PrivateFontCollection"] == null)
            {
                Application.Lock();
                privateFontCollection = new PrivateFontCollection();
                privateFontCollection.AddFontFile(@"c:\abdi\FREESCPT.TTF");
                Application["PrivateFontCollection"] = privateFontCollection;
                Application.UnLock();
            }
            else
            {
                privateFontCollection = (PrivateFontCollection)Application["PrivateFontCollection"];
            }
        }

        /// <summary>
        /// Atualiza a lista de PostEvento com os dados do usuario que solicito a certificação.
        /// </summary>
        /// <param name="nome">Nome do interessado</param>
        /// <param name="cpf">Cpf do interessado</param>
        private void emitirCertificado(string nome, string cpf, string dataEvento)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPList myListaCertificado = myWeb.Lists[nomeListaCertificado];
                SPListItem myItem = myListaCertificado.Items.Add();

                myItem["nome"] = nome;
                myItem["cpf"] = cpf;
                myItem["dataEvento"] = dataEvento;
                myItem["dataSolicitacao"] = DateTime.Now;

                myItem.Update();

                gerarCertificadoSolicitado(nome.ToUpper().Trim(), dataEvento.ToUpper());
            });

        }

        /// <summary>
        /// Gera a imagem com o nome do interessado da certificação.
        /// </summary>
        /// <remarks>Este método tem referença do site http://econit.abdi.com.br</remarks>
        /// <param name="nome">será impresso na certificação.</param>
        /// <exception cref="System.Exception">Lança uma exceção quando não pode criar a certificação.</exception>
        private void gerarCertificadoSolicitado(string nome, string dataEvento)
        {
            string modeloCertificado = String.Format("{0}/{1}", myWeb.Url, "Style Library/Certificado/Certificado_residuos.jpg");
            //SPIssueList certificados = (SPIssueList)myWeb.Lists[nomeListaCertificado];

            WebClient client = new WebClient();
            client.Credentials = CredentialCache.DefaultCredentials;
            byte[] content = client.DownloadData(modeloCertificado);

            MemoryStream msModelo = new MemoryStream(content);
            Bitmap img = (Bitmap)System.Drawing.Image.FromStream(msModelo);

            Graphics g = Graphics.FromImage(img);

            StringFormat strFormat = new StringFormat();
            strFormat.Alignment = StringAlignment.Center;

            System.Drawing.Font fonteArial = new System.Drawing.Font("Arial", 26);

            g.DrawString(nome, new System.Drawing.Font(privateFontCollection.Families[0], 18), Brushes.Black, new System.Drawing.RectangleF(200, 750, 2337, 1653), strFormat);
            //g.DrawString(dataEvento, fonteArial, Brushes.Black, new System.Drawing.RectangleF(360, 890, 1800, 100), strFormat);

            //g.DrawString("Brasília", new System.Drawing.Font(privateFontCollection.Families[0], 16), Brushes.Black, new System.Drawing.RectangleF(700, 740, 1700, 20), strFormat);

            MemoryStream msNovoModelo = new MemoryStream();
            img.Save(msNovoModelo, System.Drawing.Imaging.ImageFormat.Jpeg);
            content = msNovoModelo.ToArray();

            iTextSharp.text.Image watermark = iTextSharp.text.Image.GetInstance(content);

            watermark.SetAbsolutePosition(0, 0);

            Document documento = new Document(new iTextSharp.text.Rectangle(2337, 1653));
            MemoryStream ms = new MemoryStream();
            PdfWriter writer = PdfWriter.GetInstance(documento, ms);

            iTextSharp.text.Rectangle page = documento.PageSize;

            PdfPTable head = new PdfPTable(1);
            head.TotalWidth = 1750;

            documento.Open();

            head.WriteSelectedRows(0, -1, 486, 960, writer.DirectContent);

            documento.Add(watermark);
            documento.Close();

            myWeb.AllowUnsafeUpdates = true;

            byte[] byteArray = ms.ToArray();
            ms.Flush();
            ms.Close();
            Response.Clear();
            Response.AddHeader("Content-Disposition", "attachment; filename=certificado.pdf");
            Response.AddHeader("Content-Length", byteArray.Length.ToString());
            Response.ContentType = "application/octet-stream";
            Response.BinaryWrite(byteArray);
        }
    }
}
